package com.atguigu.gmall.realtime.joindemo;

import com.atguigu.gmall.realtime.app.BaseSQLApp;
import com.atguigu.gmall.realtime.util.SQLUtil;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;

import java.time.Duration;

/**
 * @Author lzc
 * @Date 2022/12/30 10:15
 */
public class RegularJoin_1 extends BaseSQLApp {
    public static void main(String[] args) {
        new RegularJoin_1().init(
            5001,
            2,
            "RegularJoin_1"
        );
        
    }
    
    @Override
    public void handle(StreamExecutionEnvironment env,
                       StreamTableEnvironment tEnv) {
        //每张表的每条数据, 在状态中保存 30s. 超过 30s 后,数据会被自动清除
        tEnv.getConfig().setIdleStateRetention(Duration.ofSeconds(30));
       // tEnv.getConfig().getConfiguration().setString("table.exec.state.ttl", "30 s");
        
        tEnv.executeSql("create table t1(" +
                            " id int, " +
                            " name string " +
                            ")" + SQLUtil.getKafkaSourceDDL("t1", "atguigu", "csv"));
    
        tEnv.executeSql("create table t2(" +
                            " id int, " +
                            " age int " +
                            ")" + SQLUtil.getKafkaSourceDDL("t2", "atguigu", "csv"));
        
        // select  from  a join b on a.id=b.id
        // select  from a,b where a.id=b.id
        /*tEnv.sqlQuery("select " +
                          " t1.id," +
                          " name, " +
                          " age " +
                          "from t1 " +
                          "join t2 on t1.id=t2.id")
            .execute()
            .print();*/
        tEnv.sqlQuery("select " +
                          " t1.id," +
                          " name, " +
                          " age " +
                          "from t1 " +
                          ", t2 where t1.id=t2.id")
            .execute()
            .print();
    }
}
/*
常规 join:
    1. 默认情况下, 两张表所有数据都会保存到 flink 的状态中,所以, 这些数据永远可以 join 的上.
    2. 实际使用中, 一般不需要把数据永远保存到状态中.一般会给数据设置 ttl
        根据表与表之间的业务关系
        假设:
            order_info     order_detail
            
            下单事务事实表:
                order_info 新增数据
                order_detail 新增数据
                    从业务来说, 时间几乎同时增加
                    
                    同一个订单的数据,可能会相差在 5s 内(网络波动)
                    
            支持成功事务事实表:
                支持成功的时候:
                    payment_info  新增数据
                    order_detail   无变化(只在下单的时候新增)
                    
                    30m+5s
                    
                    

 */